Micron Document




Supervisor Mode Access Prevention
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
Supervisor Mode Access Prevention (SMAP) (prévention d'accès en mode superviseur) est une fonctionnalité de certaines implémentations de CPU telles que la microarchitecture d'Intel : Broadwell qui permet aux programmes en mode superviseur de définir éventuellement des mappages de mémoire dans l'espace utilisateur afin que l'accès à ces mappages à partir du mode superviseur provoque un piège. Cela a pour but de rendre plus difficile pour les programmes malveillants de "tromper" le noyau en utilisant des instructions ou des données d'un programme de l'espace utilisateurcite-ref-lwn-1-0[1]cite-ref-intel-2-0[2].

Contents


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Histoire

La prévention d'accès en mode superviseur est conçue pour compléter la prévention d'exécution en mode superviseur (SMEP). La SMEP peut être utilisée pour empêcher le mode superviseur d'exécuter involontairement le code de l'espace utilisateur tandis que SMAP étend cette protection aux lectures et aux écriturescite-ref-intel-2-1[2].

Avantages

Sans la prévention d'accès en mode superviseur, le code superviseur a généralement un accès complet en lecture et en écriture aux mappages de mémoire de l'espace utilisateur (voir la capacité à en obtenir un accès complet). Cela a conduit au développement de plusieurs prouesses de sécurité, y compris dans l'élévation de privilèges qui fonctionnent en obligeant le noyau à accéder à la mémoire de l'espace utilisateur alors qu'il n'en avait pas l'intentioncite-ref-3[3].

Les systèmes d'exploitation peuvent bloquer ces avancées en utilisant la SMAP pour forcer les accès involontaires à la mémoire de l'espace utilisateur afin de déclencher des erreurs de page. De plus, la SMAP peut exposer un code de noyau défectueux qui ne suit pas les procédures prévues pour accéder à la mémoire de l'espace utilisateurcite-ref-lwn-1-1[1].

Cependant, l'utilisation de SMAP dans un système d'exploitation peut entraîner une plus grande taille de noyau et des accès à la mémoire de l'espace utilisateur plus lents à partir du code superviseur. Le SMAP doit être temporairement désactivé chaque fois que le code superviseur a l'intention d'accéder à la mémoire de l'espace utilisateur ce qui induit des ralentissementscite-ref-phoronix-4-0[4].

Détails techniques

Les processeurs indiquent le support de la prévention d'accès en mode superviseur via la feuille des fonctionnalités étendues CPUID.

SMAP est activé lorsque la pagination de la mémoire est active et que le bit SMAP dans le registre de contrôle CR4 est défini. SMAP peut être temporairement désactivé pour les accès mémoire explicites en définissant l'EFLAGS au flag AC : Auxiliary Carry (contrôle d'alignement). Les "stac" (Set AC Flag) et "clac" (Clear AC Flag) peuvent être utilisées pour définir ou effacer facilement le flagcite-ref-sdm-5-0[5].

Lorsque le bit SMAP dans CR4 est défini, les lectures / écritures de mémoire explicite sur les pages en mode utilisateur effectuées par du code exécuté avec un niveau de privilège inférieur à 3 entraîneront toujours une erreur de page si le flag AC de l'EFLAGS n'est pas défini. Les lectures / écritures implicites (telles que celles effectuées dans les tables de descripteurs) sur les pages en mode utilisateur déclencheront toujours une erreur de page si SMAP est activé, quelle que soit la valeur du flag CA de EFLAGScite-ref-sdm-5-1[5].

Prise en charge du système d'exploitation

La prise en charge du noyau Linux pour la prévention d'accès en mode superviseur a été implémentée par H. Peter Anvincite-ref-lwn-1-2[1]. Il a été fusionné dans le noyau Linux 3.7 principal et il est activé par défaut pour les processeurs qui prennent en charge cette fonctionnalitécite-ref-phoronix-4-1[4].

FreeBSD prend en charge la prévention d'exécution en mode superviseur depuis 2012cite-ref-6[6] et la prévention d'accès en mode superviseur depuis 2018cite-ref-7[7].

OpenBSD prend en charge la prévention d'accès en mode superviseur et la prévention d'exécution en mode superviseur associée depuis 2012cite-ref-8[8], avec OpenBSD 5.3 étant la première version avec la prise en charge de la fonctionnalité activéecite-ref-9[9].

Le support NetBSD pour la prévention d'exécution en mode superviseur (SMEP) a été implémenté par Maxime Villard en décembre 2015cite-ref-10[10]. Le support de la prévention d'accès en mode superviseur (SMAP) a également été mis en place par Maxime Villard, en août 2017cite-ref-11[11]. NetBSD 8.0 était la première version avec les deux fonctionnalités prises en charge et activéescite-ref-12[12].

Le support Haiku pour la Prévention d'Exécution en Mode Superviseur (SMEP) a été mis en place par Jérôme Duval en janvier 2018cite-ref-13[13].

macOS prend en charge SMAP au moins depuis la sortie de macOS 10.13 en 2017cite-ref-14[14].

Voir aussi

Bit NX

Références

cite-note-lwn-11. corbet2012Corbet, « Supervisor mode access prevention », LWN.net, 26 septembre 2012 (consulté le 4 août 2017)
cite-note-intel-22. mulnix2015Mulnix, « Intel Xeon Processor D Product Family Technical Overview: Supervisor Mode Access Protection (SMAP) 4 », Intel, 22 mai 2015 (consulté le 4 août 2017)
cite-note-33. corbet2009Corbet, « Fun with NULL pointers, part 1 », LWN.net, 20 juillet 2009 (consulté le 4 août 2017)
cite-note-phoronix-44. larabel2012Larabel, « Intel SMAP Comes To Try To Better Secure Linux », Phoronix, 2 octobre 2012 (consulté le 4 août 2017)
cite-note-sdm-55. 2017« Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A: System Programming Guide, Part 1 », Intel, juillet 2017 (consulté le 4 août 2017)
cite-note-66. belousov2012Belousov, « Revision 242433 », 1er novembre 2012 (consulté le 19 janvier 2018)
cite-note-77. belousov2018Belousov, « Revision 336876 », 29 juillet 2018 (consulté le 30 juillet 2018)
cite-note-88. henderson2017Henderson, « Re: Does OpenBSD have SMEP and SMAP implementation? or MPX? », sur marc.info, 26 mars 2017 (consulté le 4 août 2017)
cite-note-99. 2013« OpenBSD 5.3 », OpenBSD, 1er mai 2013 (consulté le 4 août 2017)
cite-note-1010. 2017« Significant changes from NetBSD 7.0 to 8.0 », NetBSD, 12 octobre 2017 (consulté le 9 janvier 2018)
cite-note-1111. villard2017maxime-villard2017Maxime Villard, « amd64: smap support », 23 août 2017 (consulté le 9 janvier 2018)
cite-note-1212. 2018« Announcing NetBSD 8.0 (July 17, 2018) », NetBSD, 17 juillet 2018 (consulté le 29 juillet 2018)
cite-note-1313. 2018« kernel: support for Intel SMAP and SMEP on x86_64. », Haiku (operating system), 30 janvier 2018 (consulté le 4 septembre 2018)
cite-note-1414. 2017« /osfmk/x86_64/idt64.s.auto.html », Apple Inc., 25 septembre 2017 (consulté le 19 septembre 2018)

• Portail de la sécurité des systèmes d'information